package IOTest;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedBinaryCopy {

    public static void main(String[] args) {

        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;

        Long start = System.currentTimeMillis();
        Long end = 0L;
        try {
            // 1. 创建源文件和目标文件对象
            File srcFile = new File("origin.png");
            File destFile = new File("copy_with_Buffer.png");

            // 2. 创建节点流和缓冲流
            // 2.1 创建节点流
            FileInputStream fis = new FileInputStream(srcFile);
            FileOutputStream fos = new FileOutputStream(destFile, true); // 追加写入模式

            // 2.2 创建缓冲流
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);

            // 3. 复制文件内容：读取源文件，写入目标文件
            byte[] buffer = new byte[8192]; // 使用默认缓冲区大小
            int len;
            while ((len = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, len);
                // 注意：通常不需要手动刷新缓冲区，因为bos.close()会刷新并关闭
            }

            // 4. 刷新缓冲区并准备关闭流
            bos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 5. 关闭资源：先关闭外层流，然后内层流会自动关闭
            close(bos);
            close(bis);
            end = System.currentTimeMillis();
        }
        System.out.println("Time used: " + (end - start) + "ms");
    }

    /**
     * 关闭Closeable对象，并处理可能的IOException。
     * 
     * @param closeable 需要关闭的Closeable对象，如BufferedOutputStream
     */
    private static void close(Closeable closeable) {
        if (closeable != null) {
            try {
                closeable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
